package com.estore.service;
<<<<<<< HEAD

import com.estore.model.Product;
import java.io.*;
=======
<<<<<<< HEAD

import com.estore.model.Product;
>>>>>>> a0de305f87a075295234338464a9515178f57cde
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
<<<<<<< HEAD
import java.util.Properties;
import java.util.Set;

=======
import java.util.Set;

=======
import com.estore.model.Product;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
>>>>>>> b11023a79cfe4f1287615efe508da5d11d2455ec
>>>>>>> a0de305f87a075295234338464a9515178f57cde
/**
 * 商品服务类，负责商品相关的业务逻辑
 * 目前使用内存Map模拟数据库
 */
public class ProductService {
<<<<<<< HEAD

    // 使用Map存储商品数据，key是商品ID，value是商品对象
    // 优点：通过ID查找商品时，时间复杂度是O(1)，非常高效
    private final Map<String, Product> productData = new HashMap<>();
    private String dataFilePath;
=======
<<<<<<< HEAD

=======
>>>>>>> b11023a79cfe4f1287615efe508da5d11d2455ec
    // 使用Map存储商品数据，key是商品ID，value是商品对象
    // 优点：通过ID查找商品时，时间复杂度是O(1)，非常高效
    private final Map<String, Product> productData = new HashMap<>();
>>>>>>> a0de305f87a075295234338464a9515178f57cde

    /**
     * 构造函数，初始化一些商品数据
     */
    public ProductService() {
<<<<<<< HEAD
        // 先加载配置
        loadConfig();

        // 然后尝试加载数据
        if (!loadData()) {
            // 如果加载数据失败，初始化默认数据
            initDefaultData();
        }
    }

    /**
     * 加载配置文件
     */
    private void loadConfig() {
        Properties props = new Properties();
        try (InputStreamReader reader = new InputStreamReader(
                new FileInputStream("config.properties"), "UTF-8")) {
            props.load(reader);
            dataFilePath = props.getProperty("data.file.path", "products.dat");
            System.out.println("配置文件加载成功，数据文件路径: " + dataFilePath);
        } catch (IOException e) {
            System.out.println("配置文件加载失败，使用默认路径: products.dat");
            dataFilePath = "products.dat";
        }
    }

    /**
     * 初始化默认数据
     */
    private void initDefaultData() {
=======
<<<<<<< HEAD
>>>>>>> a0de305f87a075295234338464a9515178f57cde
        // 为Java图书创建标签
        Set<String> tagsForJavaBook = new HashSet<>();
        tagsForJavaBook.add("编程");
        tagsForJavaBook.add("畅销");
        tagsForJavaBook.add("热门"); // 测试重复标签
        tagsForJavaBook.add("热门"); // 重复添加，验证Set的唯一性

        // 为MySQL图书创建标签
        Set<String> tagsForMySQLBook = new HashSet<>();
        tagsForMySQLBook.add("数据库");
        tagsForMySQLBook.add("技术");
        tagsForMySQLBook.add("热门");
<<<<<<< HEAD

=======
>>>>>>> a0de305f87a075295234338464a9515178f57cde
        productData.put("p001", new Product("p001", "Java从入门到精通", 99.0, 100, tagsForJavaBook));
        productData.put("p002", new Product("p002", "高性能MySQL", 128.5, 50, tagsForMySQLBook));
        productData.put("p003", new Product("p003", "颈椎康复指南", 45.0, 200));
        productData.put("p004", new Product("p004", "生发秘籍", 88.0, 0)); // 库存为0的商品
<<<<<<< HEAD

        System.out.println("默认数据初始化完成");
    }

    /**
     * 从文件加载数据
     * @return 是否加载成功
     */
    @SuppressWarnings("unchecked")
    public boolean loadData() {
        File file = new File(dataFilePath);
        if (!file.exists()) {
            System.out.println("数据文件不存在，将使用默认数据");
            return false;
        }

        try (ObjectInputStream ois = new ObjectInputStream(
                new FileInputStream(dataFilePath))) {

            Map<String, Product> loadedData = (Map<String, Product>) ois.readObject();
            productData.clear();
            productData.putAll(loadedData);
            System.out.println("数据加载成功，共加载 " + productData.size() + " 个商品");
            return true;

        } catch (IOException | ClassNotFoundException e) {
            System.out.println("数据加载失败: " + e.getMessage());
            return false;
        }
    }

    /**
     * 保存数据到文件
     */
    public void saveData() {
        try (ObjectOutputStream oos = new ObjectOutputStream(
                new FileOutputStream(dataFilePath))) {

            oos.writeObject(productData);
            System.out.println("数据保存成功，共保存 " + productData.size() + " 个商品到 " + dataFilePath);

        } catch (IOException e) {
            System.out.println("数据保存失败: " + e.getMessage());
        }
    }

    /**
     * 备份数据文件
     */
    public void backupData() {
        File sourceFile = new File(dataFilePath);
        if (!sourceFile.exists()) {
            System.out.println("源数据文件不存在，无法备份");
            return;
        }

        String backupFilePath = dataFilePath + ".bak";
        try (FileInputStream fis = new FileInputStream(sourceFile);
             FileOutputStream fos = new FileOutputStream(backupFilePath)) {

            byte[] buffer = new byte[1024];
            int bytesRead;

            while ((bytesRead = fis.read(buffer)) != -1) {
                fos.write(buffer, 0, bytesRead);
            }

            System.out.println("数据备份成功: " + backupFilePath);

        } catch (IOException e) {
            System.out.println("数据备份失败: " + e.getMessage());
        }
=======
=======
        productData.put("p001", new Product("p001", "Java从入门到精通", 99.0, 100));
        productData.put("p002", new Product("p002", "高性能MySQL", 128.5, 50));
        productData.put("p003", new Product("p003", "颈椎康复指南", 45.0, 200));
        productData.put("p004", new Product("p004", "生发秘籍", 88.0, 0)); // 库存为0的商品
        productData.put("p005", new Product("p005", "呼啦圈", 66.0, 100));
        productData.put("p006", new Product("p006", "暖宝宝", 5.0, 500));
>>>>>>> b11023a79cfe4f1287615efe508da5d11d2455ec
>>>>>>> a0de305f87a075295234338464a9515178f57cde
    }

    /**
     * 获取所有商品列表
     * @return 商品列表
     */
    public List<Product> getAllProducts() {
        // 从Map的值集合创建一个新的ArrayList并返回
        return new ArrayList<>(productData.values());
    }

    /**
     * 根据ID查找商品
     * @param id 商品ID
     * @return 找到的商品对象，如果不存在则返回null
     */
    public Product findProductById(String id) {
        return productData.get(id);
    }
<<<<<<< HEAD

    /**
     * 添加商品（用于测试）
     * @param product 商品对象
     */
    public void addProduct(Product product) {
        productData.put(product.getId(), product);
    }
=======
>>>>>>> a0de305f87a075295234338464a9515178f57cde
}